'use strict';

const Service = require('egg').Service;

// 请求支付功能
const AlipaySDK = require('alipay-sdk').default
// 将支付信息用 formdata 包裹住
const AlipayFormData = require('alipay-sdk/lib/form').default

class PayService extends Service {
  async toPay() {
    const {
      ctx,
      config
    } = this;
    const {
      odd,
      pay,
      title,
      id
    } = ctx.query;
    //调用 并 配置  
    const alipaySdk = new AlipaySDK({
      appId: config.payConfig.appId, // 沙箱环境的appId
      privateKey: config.payConfig.privateKey, // 私钥
      signType: config.payConfig.signType, // 签名类型
      alipayPublicKey: config.payConfig.alipayPublicKey, // 支付宝公钥
      gateway: config.payConfig.gateway, // 网关地址
      timeout: config.payConfig.timeout, // 网关超时时间
      camelcase: config.payConfig.camelcase // 是否把网关返回的下划线 key 转换为驼峰写法
    })
    //支付信息
    const formData = new AlipayFormData();
    formData.setMethod('get')
    formData.addField('appId', config.payConfig.appId)
    formData.addField('charset', 'utf-8')
    formData.addField('signType', config.payConfig.signType)
    formData.addField('notifyUrl', 'http://localhost:8080/layout/article/' + id + '?pay=true')
    formData.addField('returnUrl', 'http://localhost:8080/layout/article/' + id + '?pay=true')
    formData.addField('bizContent', {
      outTradeNo: odd, // 【必选】商户订单号：64个字符内，包含数字，字母，下划线；需要保证在商户端不重复
      productCode: 'FAST_INSTANT_TRADE_PAY', // 【必选】销售产品码，目前仅支持FAST_INSTANT_TRADE_PAY
      totalAmount: pay, // 【必选】订单总金额，精确到小数点后两位
      subject: `商品:《${title}》`, // 【必选】 订单标题
      body: `购买《${title}》文章` // 【可选】订单描述
    })
    /**
     * exec对应参数：
     * method（调用支付宝api）
     * params（api请求的参数（包含“公共请求参数”和“业务参数”））
     * options（validateSign，formData，log）
     */
    const res = {
      statu: 200,
      //发送支付获取返回页面
      url: await alipaySdk.exec('alipay.trade.page.pay', {}, {
        formData
      })
    }
    return res
  }
}

module.exports = PayService;